import {
  Injectable,
  Logger,
  OnModuleDestroy,
  OnModuleInit,
} from '@nestjs/common';
import { Etcd3 } from 'etcd3';
// import { readFileSync, watchFile, unwatchFile } from 'fs';
import * as fs from 'fs';
import * as path from 'path';

@Injectable()
export class EtcdConfigService implements OnModuleInit, OnModuleDestroy {
  private readonly logger = new Logger(EtcdConfigService.name);
  private etcd: Etcd3;
  watcher: fs.FSWatcher;

  constructor() {
    this.etcd = new Etcd3({
      hosts: 'http://localhost:2379',
      auth: {
        username: 'root',
        password: '5262',
      },
    });
  }

  /**
   * 启动生命周期钩子
   */
  async onModuleInit() {
    await this.updateEtcdConfig();
    // 监听配置变动
    this.watchEnvFile();
  }
  /**
   * 关闭生命周期钩子
   */
  async onModuleDestroy() {
    if (this.watcher) {
      this.watcher.close();
    }
  }
  /**
   * 获取.env 文件
   */
  getEnvFilePath() {
    const env = process.env.NODE_ENV || 'development';
    const filePath = path.resolve(__dirname, `../../../.env.${env}`);
    return filePath;
  }
  parseEnvConfig(content: string) {
    const lines = content.split('\n');
    const config: Record<string, string> = {};

    lines.forEach((line) => {
      line = line.trim();
      if (line === '' || line.startsWith('#')) {
        return; // 忽略空行和注释
      }
      const [key, ...valueParts] = line.split('=');
      const value = valueParts.join('=').trim(); // 支持值中包含 "=" 的情况
      if (key && value) {
        if (key.trim() === 'SERVICE_LIST') {
          (config as any)[key.trim()] = value.split(' ').filter(Boolean); // 根据空格拆分，并过滤空字符串
        } else {
          config[key.trim()] = value;
        }
      }
    });
    const res = JSON.stringify(config);
    return res;
  }
  /**
   * 监控.env 文件
   */
  watchEnvFile() {
    const envFile = this.getEnvFilePath();
    // 使用 fs.watch 监听 .env 文件
    this.watcher = fs.watch(envFile, async (eventType, filename) => {
      if (eventType === 'change') {
        this.logger.log(`${filename}文件改变. Etcd更新配置信息...`);
        await this.updateEtcdConfig();
      }
    });
  }

  /**
   * 更新配置
   */
  async updateEtcdConfig() {
    try {
      // 读文件地址
      const envFile = this.getEnvFilePath();
      // 读取内容
      const content = fs.readFileSync(envFile, 'utf8');
      // 处理内容
      const parsedConfig = this.parseEnvConfig(content);
      // 保存内容
      await this.saveEtcdConfig(parsedConfig);
    } catch (error) {
      this.logger.error('更新Etcd配置失败：', error);
    }
  }
  /**
   * 保存配置
   * @param config 配置信息
   */
  async saveEtcdConfig(config: string) {
    try {
      // console.log('config', config);
      const dataId: string = 'dev-config'; // 根据实际情况修改
      await this.etcd.put(dataId).value(config); // 将配置保存到 Nacos
    } catch (error) {
      this.logger.error('保存Etcd配置失败：', error);
    }
  }

  /**
   * 查看 配置
   * @param key key值
   * @returns 内容
   */
  async getConfig(key: string) {
    return await this.etcd.get(key).string();
  }
}
